﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AudiPyme.DAL
{
    public static class ObjetivosControlFactory
    {
        //Devuelve el nombre de un objetivo de control
        public static String ObjetivoControl(int IdControl)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            String Objetivo = (from Contr in agenteBD.ControlesEstablecer
                               join Obj in agenteBD.ObjetivosControlEstablecer on Contr.IdObjControl equals Obj.IdObjControl
                               where Contr.IdControl == IdControl
                               select Obj.Nombre).Single();
            return Objetivo;
        }

        //Devuelve una lista con los nombres de todos los objetivos de control 
        public static List<String> ObjetivosControl()
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<String> LObjetivosControl = new List<String>();
            IQueryable<String> ObjControl = from ObjC in agenteBD.ObjetivosControlEstablecer
                                            select ObjC.Nombre;
            foreach (String ObjetivoControl in ObjControl)
            {
                LObjetivosControl.Add(ObjetivoControl);
            }
            return LObjetivosControl;
        }

        //Devuelve una lista con los nombres de los objetivos de control asociados a un dominio
        public static List<String> ObjetivosControl(int IdDominioSelect)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<String> LObjetivosControl = new List<String>();
            IQueryable<String> ObjControl = from ObjC in agenteBD.ObjetivosControlEstablecer
                                            where ObjC.IdDominio == IdDominioSelect
                                            select ObjC.Nombre;
            foreach (String ObjetivoControl in ObjControl)
            {
                LObjetivosControl.Add(ObjetivoControl);
            }
            return LObjetivosControl;
        }

        //Devuelve una lista de identificadores de objetivos de control asociados a un dominio
        public static List<int> IdObjetivosControlDominio(int IdDominioSelect)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<int> LIdObjetivosControl = new List<int>();
            IQueryable<int> IdsObjControl = from ObjC in agenteBD.ObjetivosControlEstablecer
                                            where ObjC.IdDominio == IdDominioSelect
                                            select ObjC.IdObjControl;
            foreach (int IdObjCtrl in IdsObjControl)
            {
                LIdObjetivosControl.Add(IdObjCtrl);
            }
            return LIdObjetivosControl;
        }

        //Devuelve una lista con el número de controles que hay en cada uno de los objetivos de control de la ISO 27002
        public static List<int> NumeroControlesObjetivoControl()
        {
            List<int> LNumContrObjContr = new List<int>();
            ModeloContainer agenteBD = new ModeloContainer();
            List<String> LObjetivosControl = ObjetivosControlFactory.ObjetivosControl();
            for (int i = 0; i < LObjetivosControl.Count; i++)
            {
                String ObjControlActual = LObjetivosControl[i];
                int NumContrObjContr = (from NObjCtrl in agenteBD.ObjetivosControlEstablecer
                                        join Ctrl in agenteBD.ControlesEstablecer on NObjCtrl.IdObjControl equals Ctrl.IdObjControl
                                        where NObjCtrl.Nombre == ObjControlActual
                                        select NObjCtrl).Count();
                LNumContrObjContr.Add(NumContrObjContr);
            }
            return LNumContrObjContr;
        }

        //Devuelve una lista con el número de controles que hay en cada uno de los objetivos de control de la ISO 27002 asociados a un dominio determinado
        public static List<int> NumeroControlesObjetivoControl(int IdDominioSelect)
        {
            List<int> LNumContrObjContr = new List<int>();
            ModeloContainer agenteBD = new ModeloContainer();
            List<String> LObjetivosControl = ObjetivosControlFactory.ObjetivosControl(IdDominioSelect);
            for (int i = 0; i < LObjetivosControl.Count; i++)
            {
                String ObjControlActual = LObjetivosControl[i];
                int NumContrObjContr = (from NObjCtrl in agenteBD.ObjetivosControlEstablecer
                                        join Ctrl in agenteBD.ControlesEstablecer on NObjCtrl.IdObjControl equals Ctrl.IdObjControl
                                        where NObjCtrl.Nombre == ObjControlActual
                                        select NObjCtrl).Count();
                LNumContrObjContr.Add(NumContrObjContr);
            }
            return LNumContrObjContr;
        }
    }
}
